#pragma once
#define WIN32_LEAN_AND_MEAN
#include <windows.h>


/**
 * Klasa menedzera wejscia.
 *
 * @author Krzysztof Klein
 * @version 0.1
 */
class InputManager
{

	/**
	 * 
	 */
	bool joy1Attached, joy2Attached;

public:

	/**
	 * Urzadzenie wejsciowe
	 */
	enum Device
	{
		KeyboardWSAD,
		KeyboardArrows,
		Joystick1,
		Joystick2
	};

	/**
	 * Zwraca aktualne urzadzenie wejsciowe
	 */
	Device getDevice() const { return device; }
	
	/**
	 * Ustawia aktualne urzadzenie wejsciowe
	 *
	 * @return True jesli urzadzenie jest podlaczone do systemu; false jesli nie.
	 */
	bool setDevice(Device dev);

	/**
	 * Sprawdza gotowosc urzadzenia wejsciowego
	 *
	 * @return True jesli urzadzenie jest podlaczone do systemu; false jesli nie.
	 */
	bool checkDevice(Device dev);

private:

	/**
	 * Aktualne urzadzenie wejsciowe
	 */
	Device device;

public:

	/**
	 * Stan wejscia
	 */
	struct State
	{
		/**
		 * Stany klawiszy
		 */
		float up, down, left, right;


		/**
		 * Resetuje stan wejscia
		 */
		inline void reset() { up = down = left = right = 0.0f; }

	};

	/**
	 * Zwraca aktualny stan wejscia
	 */
	State getState() const { return state; }
	
private:

	/**
	 * Aktualny stan wejscia
	 */
	State state;

public:

	/**
	 * Konstruktor domyslny
	 */
	InputManager() : device(KeyboardArrows) { state.reset(); }

	/**
	 * Destruktor
	 */
	~InputManager() { close(); }

	/**
	 * Inicjalizuje menedzera wejscia dla danego okna
	 *
	 * @param hWnd Uchwyt okna
	 * @return True jesli inicjalizacja sie powiedzie; false jesli nie.
	 */
	bool initialize(HWND hWnd);


	/**
	 * Zamyka menedzera wejscia
	 */
	void close();


	/**
	 * Resetuje stan urzadzenia wejsciowego i przygotowuje je
	 * do odebrania danych.
	 */
	void reset();

	
	/**
	 * Odbiera dane z komunikatu okna WinAPI
	 *
	 * @param msg Komunikat WinAPI
	 * @param wParam Parametr 1
	 * @param lParam Parametr 2
	 * @return True jesli komunikat zostal przetworzony; false jesli nie.
	 */
	bool processInput(UINT msg, WPARAM wParam, LPARAM lParam);

};